import axios from "axios";
import { ElLoading } from "element-plus";
import { ref } from "vue";

const loadingInstance = ref(null);

const request = axios.create({
  baseURL: process.env.NODE_ENV === "development" ? "/api" : "",
  timeout: 1000,
  headers: { "X-Custom-Header": "foobar" },
});

// 添加请求拦截器
request.interceptors.request.use(
  function (config) {
    config.headers.Authorization =
      "Bearer " + localStorage.getItem("accessToken");
    // 在发送请求之前做些什么

    loadingInstance.value = ElLoading.service({ fullscreen: true });
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
request.interceptors.response.use(
  async function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么

    if (response.data.code !== 200) {
      if (response.data.code === 304) {
        return Promise.reject("内存有问题");
      } else if (response.data.code === 401) {
        const res = await refreshTokenFun();
        // 拿到接口返回值
        const accessToken = res.data.data.accessToken;
        // 拿到新的accessToken本地存储一下
        localStorage.setItem("accessToken", accessToken);
        // 设置请求体
        response.config.headers.Authorization = "Bearer " + accessToken;
        return request(response.config);
      } else if (response.data.code === 404) {
        return Promise.reject("资源找不到");
      } else if (response.data.code === 403) {
        return Promise.reject("权限");
      } else if (response.data.code === 500) {
        return Promise.reject("服务器报错");
      }
    }

    setTimeout(() => {
      loadingInstance.value.close();
    }, 1000);

    return response;
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);

// 刷新获取新的accessToken
const refreshTokenFun = () => {
  return request.get("/refreshToken", {
    params: { refreshToken: localStorage.getItem("refreshToken") },
  });
};

export default request;
